package logico;


import java.util.ArrayList;
import logico.juego;
public class Crc {
    
    private ArrayList<String> r;
    private ArrayList<Integer> pol;
    private ArrayList<String> r2;
    
    public Crc() {
        this.pol = new ArrayList<Integer>();
        this.r= new ArrayList<String>();
        this.r2 = new ArrayList<String>();
        pol.add(1);
        pol.add(0);
        pol.add(0);
        pol.add(0);
        pol.add(1);
        pol.add(0);
        pol.add(0);
        pol.add(0);
        pol.add(0);
        pol.add(0);
        pol.add(0);
        pol.add(1);
        pol.add(0);
        pol.add(0);
        pol.add(0);
        pol.add(0);
        pol.add(1);
        
    }
 
public ArrayList<String> getResultado() {
        return this.r;
    }

   
    public ArrayList<String> getResultado2() {
        return this.r2;
    }

    
   
  
public String ArmarTramaTotal(juego game) {
       
        String banderaInicio = "01111110";
        String banderaFin =    "01111110";
        String datoaux = "";
        String control  =      "00000011";
        String dir      =      "11111111";
        
        String b1  =Integer.toString(game.getBolsa1(),2);
        String b2  =Integer.toString(game.getBolsa2(),2);
        String t  =Integer.toString((game.getTurno()-1),2);
        String f =Integer.toString(game.getFondo(),2);
       
         
         if (b1.length()<15){
             String ceros="0"; 
             while(b1.length()+ceros.length()<=15){
                 ceros+="0";
                }    
             b1=ceros+b1;
         }
         
         if (b2.length()<15){
             String ceros=""; 
             while(b2.length()+ceros.length()!=15){
                 ceros+="0";
                }    
             b2=ceros+b2;
         }
         
         if (f.length()<16){
             String ceros="0"; 
             while(f.length()+ceros.length()!=16){
                 ceros+="0";
                }    
             f=ceros+f;
         }
         
         
        String dato = t+b1+b2+f;
        ArrayList<String> temp = new ArrayList<String>();
        datoaux = dato + "0000000000000000";
        char[] dato1 = datoaux.toCharArray();
        
        this.ArmarCRC16(dato1,temp, 0);
        String crc = "";
        for (String s : this.r) {
            crc = crc + s;
        }

     
        int intervalo = 16 - (crc.length());
        if (crc.length() < 16) {
            for (int i = 0; i < intervalo; i++) {
                crc = "0" + crc;
            }
        }
      

        return (banderaInicio +dir+control+dato+ crc+banderaFin);
    }

    
    public void ArmarCRC16(char[] dato, ArrayList<String> temp, int start) {
        ArrayList<String> adentro = new ArrayList<String>();

        if (dato.length > 16) {
            for (int i = start; i < start + 17; i++) {
                if (dato[i] == '0' && pol.get(i).equals(0)) {
                    adentro.add("0");
                } else if (dato[i] == '1' && pol.get(i).equals(0)) {
                    adentro.add("1");
                } else if (dato[i] == '1' && pol.get(i).equals(1)) {
                    adentro.add("0");
                } else if (dato[i] == '0' && pol.get(i).equals(1)) {
                    adentro.add("1");
                }
            }
            int j = adentro.size();
            for (int i = 0; i < j; i++) {
                if (adentro.get(i).equals("0")) {
                    adentro.remove(i);
                    i--;
                    j--;
                } else {
                    i = adentro.size();
                }
            }
            for (int i = start + 17; i < dato.length; i++) {
                adentro.add(dato[i] + "");
            }

            temp = adentro;

            char[] sale = new char[adentro.size()];
            for (int i = start; i < adentro.size(); i++) {
                sale[i] = adentro.get(i).charAt(0);
            }

            this.r = temp;
            this.ArmarCRC16(sale, temp, 0);

        } else {
            return;
        }
    }

   
public juego recuperarTrama(String trama ){
        if(trama.charAt(0)!='0'){
           trama=trama.substring(2);
        }
        String t,b1,b2,f,crc;
        System.out.println(trama);
        t=trama.substring(24,25);
        b1=trama.substring(25,41);
        b2=trama.substring(41,56);
        f=trama.substring(56,72);
        crc=trama.substring(72,(trama.length()-8));
     
          int t1=Integer.parseInt(t,2);
          int b11=Integer.parseInt(b1,2);
          int b21=Integer.parseInt(b2,2);
          int f1=Integer.parseInt(f,2);
       
        
       
          juego nuevo=new juego();
          nuevo.setTurno(t1+1);
          nuevo.setAmin(0);
          nuevo.setBolsa1(b11);
          nuevo.setBolsa2(b21);
          nuevo.setFondo(f1);
          nuevo.setCr(crc);
         
     return nuevo;
    }


    public void DesmodularCRC16(char[] dato, ArrayList<String> temp, int start) {
        ArrayList<String> adentro = new ArrayList<String>();
        if (dato.length > 16) {
            for (int i = start; i < start + 17; i++) {
                if (dato[i] == '0' && pol.get(i).equals(0)) {
                    adentro.add("0");
                } else if (dato[i] == '1' && pol.get(i).equals(0)) {
                    adentro.add("1");
                } else if (dato[i] == '1' && pol.get(i).equals(1)) {
                    adentro.add("0");
                } else if (dato[i] == '0' && pol.get(i).equals(1)) {
                    adentro.add("1");
                }
            }

            int j = adentro.size();
            for (int i = 0; i < j; i++) {
                if (adentro.get(i).equals("0")) {
                    adentro.remove(i);
                    i--;
                    j--;
                } else {
                    i = adentro.size();
                }
            }
            for (int i = start + 17; i < dato.length; i++) {
                adentro.add(dato[i] + "");
            }

            temp = adentro;

            char[] sale = new char[adentro.size()];
            for (int i = start; i < adentro.size(); i++) {
                sale[i] = adentro.get(i).charAt(0);
            }

            this.r2 = temp;
            this.DesmodularCRC16(sale, temp, 0);

        } else {
            return;
        }
    }
    
    
}

